package login;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import common.DBManager;

public class LoginServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");
	//	response.setContentType("text/html; charset=UTF-8");

//　入力パラメータの取得
		String user_id = request.getParameter( "user_id" );
		String pass = request.getParameter( "pass" );

		String error_message = null;

		String path = null;
		boolean upper_level = false;

//　未入力の確認
		if((user_id == null || user_id.equals("")) || (pass == null || pass.equals(""))){
			error_message = "担当者IDとパスワードを入力してください";
		}else{
			if (!check(user_id )){
				error_message = "担当者IDかパスワードが間違っています";
			}
		}

//　リクエストスコープに"引数1"という名前で引数2の文字列を登録
		request.setAttribute( "user_id" , user_id );
		request.setAttribute( "error_message" , error_message );

		path = "/manager/login.jsp";

		if(error_message == null){

			Connection con = null;
			Statement smt = null;
	//　SQL文を記述
			String sql = "SELECT *  FROM managers WHERE delete_flag = 0 and id = " + user_id;

			System.out.println(sql);

			try{
	//　データベースを接続するためのConnectionオブジェクトを取得
	//　SQLを発行するためのStatementオブジェクトを取得
				con = DBManager.getConnection();
				smt = con.createStatement();


				ResultSet rs = smt.executeQuery(sql);

				if (rs.next()) {
					String dbpass = rs.getString("password");
					String username = rs.getString("name");

					//一致した場合
					if (pass.equals(dbpass)){
					//管理者テーブルの該当するレコードにログイン時刻を保存する
						Calendar calendar = Calendar.getInstance();

						int year = calendar.get(Calendar.YEAR);
					    int month = calendar.get(Calendar.MONTH) + 1;
					    int day = calendar.get(Calendar.DATE);
					    int hour =calendar.get(Calendar.HOUR_OF_DAY);
					    int minute = calendar.get(Calendar.MINUTE);
					    int second = calendar.get(Calendar.SECOND);


					   String time = (year + "-" + month + "-" + day + "  " + hour + ":" + minute + ":" + second);

					//	'YYYY-MM-DD HH:MM:SS'

						String sql2 = "UPDATE managers SET time = ? WHERE id = ?";
						PreparedStatement ps = con.prepareStatement(sql2);

						ps.setString(1, time);

						ps.setInt(2,Integer.parseInt(user_id) );
						int count = ps.executeUpdate();

						ps.close();

					//セッション情報に、担当者IDと担当者名を保存する
						HttpSession session = request.getSession();
						session.setAttribute("user_id", user_id);
						session.setAttribute("username", username);


						upper_level = rs.getBoolean( "upper_level" );
					//管理者フラグが設定されている場合、担当者一覧画面へ遷移する
					//管理者フラグが設定されていない場合、担当者メニューへ遷移する
						if(upper_level){
						//	担当者一覧のアドレスを訂正	2013.10.16	若林
						//	path = "/manager/ListServlet";
							path = "/Books/manager/ListServlet";
						//	メニュー制御のため追加	2013.10.16	若林
							getServletContext().setAttribute("stage", "1");
						}else{
							path = "/member/userMenu.jsp";
							//	メニュー制御のため追加	2013.10.16	若林
							getServletContext().setAttribute("stage", "2");
						}
					}
					//一致しなかった場合
					//エラーメッセージに「担当者IDかパスワードが間違っています」を設定し、ログイン画面に遷移する
					else{
						error_message = "担当者IDかパスワードが間違っています";
						request.setAttribute( "error_message" , error_message );
						path = "/manager/login.jsp";
					}

				}
				//レコードが存在しなかった場合
				//エラーメッセージに「担当者IDかパスワードが間違っています」を設定し、ログイン画面に遷移する
				else{
					error_message = "担当者IDかパスワードが間違っています";
					request.setAttribute( "error_message" , error_message );
					path = "/manager/login.jsp";
				}

			}catch( SQLException e ){

				throw new ServletException( e );

			}finally{

				if( smt != null ){

					try{
						smt.close();
					}catch( SQLException ignore ){
						//　何もしない
					}
				}
				if( con != null ){

					try{
						con.close();
					}catch( SQLException ignore ){
						//　何もしない
					}
				}
			}
		}

// RequestDispatcherオブジェクトの取得
//	フォワードの実行
//	担当者一覧への遷移をリダイレクトに変更	2013.10.16	若林
//		RequestDispatcher dispatcher = request.getRequestDispatcher(path);
//		dispatcher.forward(request, response);
		if(upper_level){
			response.sendRedirect(path);
		}
		else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(path);
			dispatcher.forward(request, response);
		}
	}

	/**
     * 数値チェック
     * double に変換でききない文字列が渡された場合は false を返します。
     * @param str チェック文字列
     * @return 引数の文字列が数値である場合 true を返す。
     */
    public boolean check(String str) {
        try {
            Integer.parseInt(str);
            return true;
        } catch(NumberFormatException e) {
            return false;
        }
    }

}
